package routePlanner.algorithm;

import routePlanner.entities.Atraction;
import routePlanner.entities.AtractionType;
import routePlanner.entities.City;
import routePlanner.entities.CityConnection;
import routePlanner.entities.Vehicle;

import java.util.List;
import java.util.ArrayList;

/*
 * Klasa przechowująca graf krawędzi skierowanych reprezentowany za pomocą list sąsiedztwa krawędzi
 */
public class DirectedGraph {
	//liczba wierzchołków
	private final int v;
	//liczba krawędzi
	private int e;
	//listy sąsiedztwa
	private List<CityConnection>[] neighborhoodLists;

	public DirectedGraph(int v) {
		this.v = v;
		this.e = 0;
		this.neighborhoodLists = (List<CityConnection>[]) new List[v];
		for (int i = 0; i < v; i++) {
			neighborhoodLists[i] = new ArrayList<CityConnection>();
		}
	}

	//zwraca liczbę krawędzi
	public int getNumberOfEdges() {
		return e;
	}

	//zwraca liczbę wierzchołków
	public int getNumberOfVertices() {
		return v;
	}

	/**
	 * Dodaje krawędź skierowaną do odpowiedniej listy sąsiedztwa
	 * @param edge
	 *            krawędź, która ma zostać dodana do grafu
	 */
	public void addEdge(CityConnection edge) {
		neighborhoodLists[edge.getStartCity().getId()-1].add(edge);
		e++;
	}

	/**
	 * Zwraca listę sąsiedztwa danego wierzchołka
	 * @param v
	 *            indeks wierzchołka skierowanego (id miasta - 1)
	 * @return
	 *			zwraca iterowalną kolekcję krawędzi skierowanych
	 */
	public Iterable<CityConnection> getNeighborhoodList(int v) {
		return neighborhoodLists[v];
	}
}